package types

import (
	"encoding/json"
	"time"
)

// CustomTime 自定义时间类型，处理零值
type CustomTime struct {
	time.Time
}

// MarshalJSON 自定义JSON序列化
func (ct CustomTime) MarshalJSON() ([]byte, error) {
	if ct.IsZero() {
		return json.Marshal(nil)
	}
	return json.Marshal(ct.Time.Format(time.RFC3339))
}

// UnmarshalJSON 自定义JSON反序列化
func (ct *CustomTime) UnmarshalJSON(data []byte) error {
	if string(data) == "null" {
		ct.Time = time.Time{}
		return nil
	}
	var timeStr string
	if err := json.Unmarshal(data, &timeStr); err != nil {
		return err
	}
	t, err := time.Parse(time.RFC3339, timeStr)
	if err != nil {
		return err
	}
	ct.Time = t
	return nil
}

// Task 定时任务
type Task struct {
	ID          string     `json:"id"`
	Name        string     `json:"name"`
	Command     string     `json:"command"`
	Schedule    string     `json:"schedule"`
	Enabled     bool       `json:"enabled"`
	IsPinned    bool       `json:"isPinned"`
	Description string     `json:"description"`
	NextRun     CustomTime `json:"nextRun"`
	LastRun     CustomTime `json:"lastRun"`
	Running     bool       `json:"running"`
	ExecutionID string     `json:"executionId,omitempty"`
	CreatedAt   CustomTime `json:"createdAt"`
	UpdatedAt   CustomTime `json:"updatedAt"`
}

// TaskExecution 任务执行记录
type TaskExecution struct {
	ID        string    `json:"id"`
	TaskID    string    `json:"taskId"`
	TaskName  string    `json:"taskName"`
	StartTime time.Time `json:"startTime"`
	EndTime   *time.Time `json:"endTime,omitempty"`
	Duration  int64     `json:"duration"` // 毫秒
	Status    string    `json:"status"`   // running, success, error
	Output    string    `json:"output"`
}

// ExecuteTaskResponse 执行任务的响应
type ExecuteTaskResponse struct {
	Success     bool   `json:"success"`
	ExecutionID string `json:"executionId,omitempty"`
	Message     string `json:"message,omitempty"`
}

// ExecutionResponse 执行记录的响应
type ExecutionResponse struct {
	Success bool          `json:"success"`
	Data    TaskExecution `json:"data,omitempty"`
	Message string        `json:"message,omitempty"`
} 